开发 Nx 扩展:Monorepo 项目全链路总结
概述
完成 Nx Remote Cache 七牛云插件的开发后,本节回顾 Monorepo 项目的完整技术链路:从需求产生到方案选型,从本地缓存到远端缓存,从 Lerna 到 Nx 的演进历程。
技术链路回顾
需求演进
阶段1:单体项目
└── 问题:代码耦合、发布困难
阶段2:Lerna Monorepo
└── 问题:构建慢、无缓存机制
阶段3:Turborepo / Nx Monorepo
└── 本地缓存 → 加速构建
└── 问题:团队成员间缓存不共享
阶段4:Remote Cache
└── 远端缓存 → 团队共享构建产物
└── 需求:接入七牛云存储
text
核心工具对比
| 工具 | 定位 | 缓存能力 | Remote Cache | 适用规模 |
|---|---|---|---|---|
| Lerna | 包管理 + 发布 | 无 | 无 | 小型 Monorepo |
| Turborepo | 构建系统 | 本地缓存 | 官方托管(付费) | 中型 Monorepo |
| Nx | 构建系统 + CLI | 本地缓存 | 自托管/官方 | 大型 Monorepo |
Nx 生态体系
Nx CLI 的商业化逻辑
Nx CLI(免费)
└── 本地缓存(task hashing + computation caching)
└── 依赖图分析
└── 项目生成器
Nx Cloud(付费)
└── Remote Cache(远端缓存)
└── 分布式任务执行
└── AI 辅助
text
Nx 开发 CLI 的核心目的是推动 Nx Cloud 的商业化。社区开发者可以基于 Nx 的 Remote Cache 接口开发自托管的缓存后端。
本项目的定位
Nx Remote Cache 七牛云插件
├── 实现 Nx 的 Custom Runner 接口
├── 将构建缓存存储到七牛云对象存储
├── 团队内共享构建产物,避免重复构建
└── 替代 Nx Cloud 的付费方案
text
项目核心知识点
1. 包管理方案
# pnpm workspace(推荐)
pnpm-workspace.yaml
packages:
- 'packages/*'
# Lerna(版本管理 + 发布)
lerna version --conventional-commits
lerna publish from-package
bash
2. 构建加速原理
// Nx 任务的哈希计算
// hash = 源码内容 + 依赖关系 + 环境配置 + CLI 参数
// 如果 hash 命中缓存 → 直接复用构建产物
// 如果 hash 未命中 → 执行构建并存储结果
typescript
3. Remote Cache 接口
// 自定义 Runner 需要实现的接口
interface RemoteCache {
// 存储构建产物
store(hash: string, files: string[]): Promise<void>
// 检索构建产物
retrieve(hash: string, cacheDirectory: string): Promise<boolean>
}
typescript
4. 七牛云存储集成
// 上传构建缓存
import * as qiniu from 'qiniu'
async function uploadToQiniu(
accessKey: string,
secretKey: string,
bucket: string,
key: string,
localFile: string
) {
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey)
const uploadToken = new qiniu.rs.PutPolicy({ scope: `${bucket}:${key}` }).uploadToken(mac)
const uploader = new qiniu.form_up.FormUploader()
return new Promise((resolve, reject) => {
uploader.putFile(uploadToken, key, localFile, null, (err, body) => {
err ? reject(err) : resolve(body)
})
})
}
typescript
技术栈全景
Monorepo 全链路技术栈
├── 包管理: pnpm workspaces
├── 版本管理: Lerna / Changesets
├── 构建工具: Nx / Turborepo
├── 构建加速: 本地缓存 + Remote Cache
├── 云存储: 七牛云对象存储
├── CI/CD: GitHub Actions
└── 发布目标: NPM Registry
text
实践要点
- Nx 和 Lerna 的常用命令相对简单,建议查阅官方文档快速上手
- Remote Cache 的价值在于团队协作:A 构建后 B 可以直接复用,省去重复构建时间
- 自研 Remote Cache 插件时,需确保与 Nx 的任务哈希计算逻辑完全兼容
- 构建缓存的有效性取决于源码、依赖、环境的完整哈希
- 项目的每个环节都有独立的学习价值,可根据自身需要深入某个方向
↑